#include "UDPServer.hpp"
#include <memory>
#include "Route.hpp"
#include "Inetaddr.hpp"
#include "ThreadPool.hpp"

using namespace ThreadModule;

using task_t=std::function<void()>;

std::string handler(const std::string &str)
{
    std::string s = "hello ";
    s += str;
    return s;
}

//   ./UDPServer.cc  ip port
int main(int argc, char *argv[])
{
    if (argc != 2)
    {
        LOG(LogLevel::FATAL) << "Usage: ip port";
        exit(1);
    }
    uint16_t port = std::stoi(argv[1]);
    // std::string ip((char*)argv[1]);

    // 1.路由模块
    Route r;

    // 2.线程池模块
    ThreadPool<std::function<void()>> *tp = ThreadPool<std::function<void()>>::GetInstance();

    // 3.服务器模块
        //单线程版本
    // std::unique_ptr<UDPServer> sv = std::make_unique<UDPServer>(port,[&r](int fd, const std::string &message, sockaddr_in ia){
    //    r.Send(fd,message,ia);
    // });
        //多线程版本 ->两层lambda绑定参数
    // std::unique_ptr<UDPServer> sv = std::make_unique<UDPServer>(port, [&r, &tp](int fd, const std::string &message, sockaddr_in ia)
    //                                                  { tp->Equeue([=, &r]()
    //                                                               { r.Send(fd, message, ia); }); });
        //多线程版本 ->lambda+bind绑定参数
    std::unique_ptr<UDPServer> sv = std::make_unique<UDPServer>(port,[&r,&tp](int fd, const std::string &message, sockaddr_in ia){
        std::function<void()> task=std::bind(&Route::Send,&r,fd,message,ia);
        tp->Equeue(task);
    });

    sv->Init();
    sv->Start();
    return 0;
}